#ifndef _TDA_GESTOR_INCIDENCIAS_H_
#define _TDA_GESTOR_INCIDENCIAS_H_

/*#include <stdlib.h>
#include <stdio.h>
#include "listasimple.h"
#include "cola.h"*/
/*#include "tda_incidencia.h"*/
#include "utils.h"


/* Defines */
#define ERR_PROYECTO_INEXISTENTE -1;
#define ERR_USUARIO_INEXISTENTE -2;
#define ERR_AGREGAR_INCIDENCIA -3;
#define ERR_NO_HAY_INCIDENCIAS -1;

/* Tipos y Enumerados */

typedef struct
{
    int user_id;
    char* user_name;
} user_t;

typedef struct
{
    int project_id;
    char* project_name;
} project_t;

typedef struct
{
    TListaSimple incidencias;
    TListaSimple proyectos;
    TListaSimple usuarios;
    int max_id_incidencia;
    int max_id_proyecto;
    int max_id_usuario;
} TGI;

/* Primitivas */

int TGI_Crear ( TGI* tgi, const char* proyectos, const char* usuarios, const char* incidencias );

int TGI_Cerrar( TGI* tgi );

int TGI_AgregarIncidencia ( TGI* tgi, tipo_inci_t inci_type, prior_inci_t inci_priority, int inci_user, int inci_assigned_user,
                            char* inci_date_created, int inci_project_id, char* inci_summary, char* inci_description );

int TGI_GetIncidencia( const TGI* tgi, int inci, TIN* tin );

int TGI_GetIncidenciasUsuario(const TGI* tgi, int usuario, TCola* incidencias);

int TGI_GetIncidenciasProyecto(const TGI* tgi, int proyecto, TListaSimple* incidencias );

int TGI_GetUsuario(const TGI* tgi, int usuario, user_t* info_usuario);

int TGI_AgregarUsuario(TGI* tgi, int user_id, const char* user_name);

/** PRE: TGI LLENO Y NO VACIO
    POST: DEVUELVE RES_OK SI LO ENCONTRO Y UNA ESTRUCTURA CON LOS DATOS, QUEDA A DISPOSICI�N DEL USUARIO LIBERAR ESA
    MEMRORIA, DEVUELVE ERR_ID_PROJECT_INEXISTENTE SI NO EXISTE EL PROYECTO EN TGI
    FUNCION: DEVUELVE LOS DATOS DE UN PROYECTO CON ID "PROYECTO"
    PARAMETROS: tgi: EL MANIPULADOR DEL TGI
              proyecto: EL ID DEL PROYECTO A OBTENER DATOS
              info_proyecto:LA ESTRUCTURA DONDE SE DEVUELVEN LOS DATOS

  */
int TGI_GetProyecto(const TGI* tgi, int proyecto, project_t* info_proyecto);

/** PRE: tgi con memoria reservada
        project_name con memoria reservada y no vacio
   POST: Regresa RES_OK si agrego a la lista de proyectos.
         Regresa ERR_ID_PROJECT_EXISTENTE si el project_id ya existe.
         regresa ERR_UNDEFINED por cualquier otro error.
   FUNCION: AGREGA UN PROYECTO A TGI
   PAR�METROS: TGI: EL MANIPULADOR DE LAS INCIDENCIAS
               PROJECT_ID: EL ID DEL PROYECTO
               PROJECT_NAME: EL NOMBRE DEL PROYECTO
*/
int TGI_AgregarProyecto(TGI* tgi, int project_id, const char* project_name);
int TGI_Grabar(TGI* tgi, const char* R_Usuario, const char* R_Proyecto, const char* R_Incidencia);
int ActualizarEstados(TListaSimple* incidencias,int inci_id,int usuario_id,char* fecha,stat_inci_t estado);
int ActualizarComentarios(TListaSimple* incidencias,int inci_id,int usuario_id,char* fecha,char* comentario,int cod,resol_inci_t resolucion);

#endif /* _TDA_GESTOR_INCIDENCIAS_H_ */
